/******************************************************************************* * Copyright (c) 2000, 2017 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.eclipse.dltk.internal.ui.refactoring.reorg; import org.eclipse.core.resources.IResource; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.ModelException; import org.eclipse.dltk.internal.corext.refactoring.reorg.ICreateTargetQuery; import org.eclipse.dltk.internal.corext.refactoring.reorg.IReorgDestinationValidator; import org.eclipse.dltk.internal.ui.refactoring.QualifiedNameComponent; import org.eclipse.dltk.internal.ui.refactoring.RefactoringMessages; import org.eclipse.dltk.internal.ui.util.SWTUtil; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.participants.MoveRefactoring; import org.eclipse.ltk.ui.refactoring.RefactoringWizard; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; public class ReorgMoveWizard extends RefactoringWizard { public ReorgMoveWizard(MoveRefactoring ref) { super(ref, DIALOG_BASED_USER_INTERFACE | computeHasPreviewPage(ref)); if (isTextualMove(ref)) setDefaultPageTitle(ReorgMessages.ReorgMoveWizard_textual_move); else setDefaultPageTitle(ReorgMessages.ReorgMoveWizard_3); } private static boolean isTextualMove(MoveRefactoring ref) { ScriptMoveProcessor moveProcessor = ref .getAdapter(ScriptMoveProcessor.class); return moveProcessor.isTextualMove(); } private static int computeHasPreviewPage(MoveRefactoring refactoring) { ScriptMoveProcessor processor = refactoring .getAdapter(ScriptMoveProcessor.class); if (processor.canUpdateReferences() || processor.canEnableQualifiedNameUpdating()) return NONE; return NO_PREVIEW_PAGE; } @Override protected void addUserInputPages() { addPage(new MoveInputPage()); } private static class MoveInputPage extends ReorgUserInputPage { private static final String PAGE_NAME = "MoveInputPage"; //$NON-NLS-1$ private Button fReferenceCheckbox; private Button fQualifiedNameCheckbox; private QualifiedNameComponent fQualifiedNameComponent; private ICreateTargetQuery fCreateTargetQuery; private Object fDestination; public MoveInputPage() { super(PAGE_NAME); } private ScriptMoveProcessor getScriptMoveProcessor() { return getRefactoring().getAdapter(ScriptMoveProcessor.class); } @Override protected Object getInitiallySelectedElement() { return getScriptMoveProcessor().getCommonParentForInputElements(); } @Override protected IModelElement[] getScriptElements() { return getScriptMoveProcessor().getScriptElements(); } @Override protected IResource[] getResources() { return getScriptMoveProcessor().getResources(); } @Override protected IReorgDestinationValidator getDestinationValidator() { return getScriptMoveProcessor(); } @Override protected boolean performFinish() { return super.performFinish() || getScriptMoveProcessor().wasCanceled(); // close the // dialog if // canceled } @Override protected RefactoringStatus verifyDestination(Object selected) throws ModelException { ScriptMoveProcessor processor = getScriptMoveProcessor(); final RefactoringStatus refactoringStatus; if (selected instanceof IModelElement) refactoringStatus = processor .setDestination((IModelElement) selected); else if (selected instanceof IResource) refactoringStatus = processor .setDestination((IResource) selected); else refactoringStatus = RefactoringStatus.createFatalErrorStatus( ReorgMessages.ReorgMoveWizard_4); updateUIStatus(); fDestination = selected; return refactoringStatus; } private void updateUIStatus() { getRefactoringWizard().setForcePreviewReview(false); ScriptMoveProcessor processor = getScriptMoveProcessor(); if (fReferenceCheckbox != null) { fReferenceCheckbox.setEnabled(canUpdateReferences()); processor.setUpdateReferences(fReferenceCheckbox.getEnabled() && fReferenceCheckbox.getSelection()); } if (fQualifiedNameCheckbox != null) { boolean enabled = processor.canEnableQualifiedNameUpdating(); fQualifiedNameCheckbox.setEnabled(enabled); if (enabled) { fQualifiedNameComponent .setEnabled(processor.getUpdateQualifiedNames()); if (processor.getUpdateQualifiedNames()) getRefactoringWizard().setForcePreviewReview(true); } else { fQualifiedNameComponent.setEnabled(false); } processor.setUpdateQualifiedNames( fQualifiedNameCheckbox.getEnabled() && fQualifiedNameCheckbox.getSelection()); } } private void addUpdateReferenceComponent(Composite result) { final ScriptMoveProcessor processor = getScriptMoveProcessor(); if (!processor.canUpdateReferences()) return; fReferenceCheckbox = new Button(result, SWT.CHECK); fReferenceCheckbox .setText(ReorgMessages.ScriptMoveAction_update_references); fReferenceCheckbox.setSelection(processor.getUpdateReferences()); fReferenceCheckbox.setEnabled(canUpdateReferences()); fReferenceCheckbox.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { processor.setUpdateReferences( ((Button) e.widget).getSelection()); updateUIStatus(); } }); } private void addUpdateQualifiedNameComponent(Composite parent, int marginWidth) { final ScriptMoveProcessor processor = getScriptMoveProcessor(); if (!processor.canEnableQualifiedNameUpdating() || !processor.canUpdateQualifiedNames()) return; fQualifiedNameCheckbox = new Button(parent, SWT.CHECK); int indent = marginWidth + fQualifiedNameCheckbox .computeSize(SWT.DEFAULT, SWT.DEFAULT).x; fQualifiedNameCheckbox.setText( RefactoringMessages.RenameInputWizardPage_update_qualified_names); fQualifiedNameCheckbox .setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fQualifiedNameCheckbox .setSelection(processor.getUpdateQualifiedNames()); fQualifiedNameComponent = new QualifiedNameComponent(parent, SWT.NONE, processor, getRefactoringSettings()); fQualifiedNameComponent .setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); GridData gd = (GridData) fQualifiedNameComponent.getLayoutData(); gd.horizontalAlignment = GridData.FILL; gd.horizontalIndent = indent; updateQualifiedNameUpdating(processor, processor.getUpdateQualifiedNames()); fQualifiedNameCheckbox.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { boolean enabled = ((Button) e.widget).getSelection(); updateQualifiedNameUpdating(processor, enabled); } }); } private void updateQualifiedNameUpdating( final ScriptMoveProcessor processor, boolean enabled) { fQualifiedNameComponent.setEnabled(enabled); processor.setUpdateQualifiedNames(enabled); updateUIStatus(); } @Override public void createControl(Composite parent) { Composite result; boolean showDestinationTree = !getScriptMoveProcessor() .hasDestinationSet(); if (showDestinationTree) { fCreateTargetQuery = getScriptMoveProcessor() .getCreateTargetQuery(); super.createControl(parent); getTreeViewer().getTree().setFocus(); result = (Composite) super.getControl(); } else { initializeDialogUnits(parent); result = new Composite(parent, SWT.NONE); setControl(result); result.setLayout(new GridLayout()); Dialog.applyDialogFont(result); } addUpdateReferenceComponent(result); addUpdateQualifiedNameComponent(result, ((GridLayout) result.getLayout()).marginWidth); setControl(result); Dialog.applyDialogFont(result); } @Override protected Control addLabel(Composite parent) { if (fCreateTargetQuery != null) { Composite firstLine = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(2, false); layout.marginHeight = layout.marginWidth = 0; firstLine.setLayout(layout); firstLine.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Control label = super.addLabel(firstLine); label.addTraverseListener(e -> { if (e.detail == SWT.TRAVERSE_MNEMONIC && e.doit) { e.detail = SWT.TRAVERSE_NONE; getTreeViewer().getTree().setFocus(); } }); Button newButton = new Button(firstLine, SWT.PUSH); newButton.setText(fCreateTargetQuery.getNewButtonLabel()); GridData gd = new GridData( GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING); gd.widthHint = SWTUtil.getButtonWidthHint(newButton); newButton.setLayoutData(gd); newButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { doNewButtonPressed(); } }); return firstLine; } else { return super.addLabel(parent); } } private boolean canUpdateReferences() { return getScriptMoveProcessor().canUpdateReferences(); } private void doNewButtonPressed() { Object newElement = fCreateTargetQuery .getCreatedTarget(fDestination); if (newElement != null) { TreeViewer viewer = getTreeViewer(); ITreeContentProvider contentProvider = (ITreeContentProvider) viewer .getContentProvider(); viewer.refresh(contentProvider.getParent(newElement)); viewer.setSelection(new StructuredSelection(newElement), true); viewer.getTree().setFocus(); } } } }